
#include "Arbol_HMIHD_static.h"


ArbolHMIHD_static::ArbolHMIHD_static(){

}
void ArbolHMIHD_static::crear(){
	numElem=0;
	inicioPila=0;
	for(int i=0;i<20;i++){
		estructuraDatos[i].HMI=i+1;
		estructuraDatos[i].HD=0;
		estructuraDatos[i].padre=0;
		estructuraDatos[i].etiqueta='0';
	}
}


ArbolHMIHD_static::~ArbolHMIHD_static(){
delete []estructuraDatos;

}

void ArbolHMIHD_static::vaciar(){
	inicioPila=0;
	numElem=0;

	for(int i=0;i<20;i++){
		estructuraDatos[i].HMI=i+1;
	}
}

int ArbolHMIHD_static::vacio(){
	return !numElem;
}

void ArbolHMIHD_static::borrar(int nodo){
	int nh;
	numElem--;
	nh=estructuraDatos[nodo].padre;
	nh=estructuraDatos[nh].HMI;
	if(nh==nodo){
        int padre=estructuraDatos[nodo].padre;
        estructuraDatos[padre].HMI=-1;
	}
	else{
        while(estructuraDatos[nh].HD!=nodo){
            nh=estructuraDatos[nh].HD;
        }
	estructuraDatos[nh].HD=estructuraDatos[nodo].HD;
	}
	estructuraDatos[nodo].HMI = inicioPila;
	inicioPila=nodo;
}

void ArbolHMIHD_static::agregarHijo(char nEtiqueta, int nPadre,int ubicacion){
    numElem++;
    int elemPila=inicioPila;
    inicioPila=estructuraDatos[inicioPila].HMI;
    estructuraDatos[elemPila].etiqueta=nEtiqueta;
    estructuraDatos[elemPila].padre=nPadre;
    estructuraDatos[elemPila].HMI=-1;

    if(ubicacion==1){
        estructuraDatos[elemPila].HD=estructuraDatos[nPadre].HMI;
        estructuraDatos[nPadre].HMI=elemPila;
    }else{
        int numeroDeHijo=estructuraDatos[nPadre].HMI;
        for(int i=2;i<ubicacion;i++){
            numeroDeHijo=estructuraDatos[numeroDeHijo].HD;
        }
        estructuraDatos[elemPila].HD=estructuraDatos[numeroDeHijo].HD;
        estructuraDatos[numeroDeHijo].HD=elemPila;
    }
}

int ArbolHMIHD_static::numNodos(){
	return numElem;
}

int ArbolHMIHD_static::numHijos(int nodo){
	int numHijos=0;
	if(estructuraDatos[nodo].HMI!=-1){
		numHijos++;
		nodo=estructuraDatos[nodo].HMI;
		while(estructuraDatos[nodo].HD!=-1){
			numHijos++;
			nodo=estructuraDatos[nodo].HD;
		}
	}
	return numHijos;
}


int ArbolHMIHD_static::raiz(){
	return 1;
}

void ArbolHMIHD_static::ponerRaiz(char nEtiqueta){
    numElem=1;
	estructuraDatos[0].HD=-1;
	estructuraDatos[0].HMI=-1;
	estructuraDatos[0].etiqueta=nEtiqueta;
	inicioPila=1;
}

int ArbolHMIHD_static::padre(int nodo){
	return estructuraDatos[nodo].padre;

}

int ArbolHMIHD_static::hijoMasIzq(int nodo){
	return estructuraDatos[nodo].HMI;
}
int ArbolHMIHD_static::hermanoDer(int nodo){
	return estructuraDatos[nodo].HD;
}

char ArbolHMIHD_static::recuperar(int nodo){
	return estructuraDatos[nodo].etiqueta;
}

void ArbolHMIHD_static::modificarEtiqueta(char nEtiqueta,int nodo){
	estructuraDatos[nodo].etiqueta = nEtiqueta;
}

void ArbolHMIHD_static::imprimir(){
    cout<<inicioPila<<endl;
 	for(int i=0;i<20;i++){
		cout<<i<<"         "<<estructuraDatos[i].HMI<<" "<<estructuraDatos[i].etiqueta<<" "<<estructuraDatos[i].HD<<" "<<estructuraDatos[i].padre<<endl;
	}
}


